//
//  WBBaseViewController.swift
//  仿微博
//
//  Created by RaoBo on 2018/12/4.
//  Copyright © 2018年 RB. All rights reserved.
//

import UIKit

//问题？OC支持多继承吗？如果不支持如何替代? 答：使用协议替代!，协议定义的是方法，实现对应的方法就具备响应的能力。
//Swift 的写法更类似于多继承。
//class WBBaseViewController: UIViewController,UITableViewDelegate,UITableViewDataSource
//Swift 中使用 extension 可以将函数按照功能进行划分,方便阅读
//备注:
// 1.extension 不能有属性
// 2.extension 不能重写’父类‘本类中的方法。重写是子类重写父类的方法。扩展是对类的扩展！
//extension拆分代码方便阅读。



//基类控制器。
class WBBaseViewController: UIViewController {
    //MARK:-申明属性的地方
    
    //12-14标记用户登录
    var userLogon = false
    
    //申明表格视图,如果没有登录就不创建,∴ 不应该用懒加载。
    var tableView:UITableView? //:定义属性,
    //12-23 var访客视图字典
    var visitInfoDictionary:[String:String]?;
    
    //定义刷新控件
    var refreshController: UIRefreshControl?
    
    //上拉刷新标记
    var isPullup = false
    
    //自定义导航条
    lazy var navigationBar:WBNavigationBar = WBNavigationBar(frame: CGRect(x: 0, y: 0, width: UIScreen.hm_screenWidth(), height: 64));
    
    //自定义导航条目 --> 在设置导航按钮都使用 navItem
    lazy var navItem = UINavigationItem()
    
    //MARK:-写方法的地方
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
        loadData()
        
        //不让调整间距,屏蔽默认 20 缩进
//        automaticallyAdjustsScrollViewInsets = false;
        tableView?.contentInsetAdjustmentBehavior = .never;
    
        //设置上下间距
        tableView?.contentInset = UIEdgeInsetsMake(navigationBar.bounds.height,
                                                   0,
                                                   tabBarController?.tabBar.bounds.height ?? 0,
                                                   0)

        //添加刷新控件
        //1>实例化
        refreshController = UIRefreshControl()
        //2>添加到tableView上
        tableView?.addSubview(refreshController!)
        //3>设置监听方法
        refreshController?.addTarget(self, action: #selector(loadData), for: .valueChanged)
        
    }

    //重写 title 的 didSet方法(Swift)  setter(OC)
    override var title: String? {
        didSet {
            navItem.title = title
        }
    }
    
    
    
    //加载数据 - 具体实现由子类负责。
    @objc func loadData() {
        //如果子类不实现,默认关闭刷新控件
        refreshController?.endRefreshing()
    }
}


//使用 extension(类似OC的协议) 分割代码块
extension WBBaseViewController {
    //语法有变,必须加上 @objc, 子类也得加。否则报错❌
    @objc func setupUI() {
        view.backgroundColor = UIColor.white
        
        setupNavBar()

        //三目,弹性很强
        userLogon ? setupTableView() : setupVisitorView()
    }
        
    //设置表格视图
    private func setupTableView() {
        tableView = UITableView(frame: view.bounds, style: .plain);
        //addSubview往数组中添加,必须要有值。!
//        view.addSubview(tableView!) //
        view.insertSubview(tableView!, belowSubview: navigationBar) //强行解包 ！
        //OC和Swift的区别:OC不遵守协议是警告,swift中不遵守协议是错误。
        tableView?.delegate = self
        tableView?.dataSource = self
        
       
    }
    
    //12-14设置访客视图
    private func setupVisitorView() {
        let visitorView = WBVisitorView(frame: view.bounds)
        visitorView.visitorInfo = visitInfoDictionary
        view.insertSubview(visitorView, belowSubview: navigationBar)
    }
    
    //设置导航条
    private func setupNavBar() {
        //设置导航条
        view.addSubview(navigationBar)
        //将item设置给bar
        navigationBar.items = [navItem]
        //设置navigationBar 的渲染色
        navigationBar.barTintColor = UIColor.hm_color(withHex: 0xF6F6F6)
        
        //设置导航条标题文字颜色
        //tips: 设置文字颜色,color 无效,就试试 attxxxx
        navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.darkGray];
        
        //错误演示
        /**
         1.OC中 [ ] 调用方法，Swift中没有
         Swift 中 ，数组、字典都用  [ ] 表示
         [] 数组
         [key : value ] 字典
         */
        
        // 崩溃到main 都是OC干的事
        //        navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor:[UIColor.red]];
    }
}


//MARK: - UITableViewDataSource,UITableViewDelegate
//注意写法 : 是冒号
extension WBBaseViewController : UITableViewDataSource,UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 0
    }
    
    //基类只是准备方法,不负责具体实现, 子类负责具体实现
    //子类的数据源不需要super
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        //只是保证没有语法错误
        return UITableViewCell()
    }
}


